﻿using System;
using System.Collections.Generic;
using System.Text;
using System.ComponentModel;
using Sinacor.Infra.Service.Validation;
using Sinacor.Infra.Service.Common;
using Sinacor.Infra.Common.Exceptions;
using Sinacor.Infra.Service.ExceptionHandling;
using Sinacor.Infra.Service.Validation.BusinessRules;
using Sinacor.Infra.Common.Validation;


namespace Sinacor.Servico.Bovespa.Corretagem.BusinessLogic.BusinessRuleValidation
{

    /// <summary>
    /// Valida se foram informadas as listagens de referência à politica de corretagem,
    /// no caso, Beneficios e Verificacoes
    /// </summary>
    public class ValidaReferenciasPoliticaCorretagem : BaseBusinessRuleValidation<BusinessEntity.PoliticaCorretagem>, IBusinessRuleValidation
    {
        #region Atributos
        private int _erroObjetoNulo = 109556;
        private int _informarCondicoesVerificacao = 109557;
        private int _informarControleBeneficio = 109558;
        private int _informarDataInicialMaiorDataFinal = 109878;
        #endregion

        #region Propriedades
        /// <summary>
        /// Objeto nulo
        /// </summary>
        public int ErroObjetoNulo
        {
            get
            {
                return _erroObjetoNulo;
            }
            set
            {
                _erroObjetoNulo = value;
            }
        }

        /// <summary>
        /// Condicoes de Verificacao
        /// </summary>
        public int InformarCondicoesVerificacao
        {
            get
            {
                return _informarCondicoesVerificacao;
            }
            set
            {
                _informarCondicoesVerificacao = value;
            }
        }

        /// <summary>
        /// Controle de Beneficio
        /// </summary>
        public int InformarControleBeneficio
        {
            get
            {
                return _informarControleBeneficio;
            }
            set
            {
                _informarControleBeneficio = value;
            }
        }

        /// <summary>
        /// Data Inicial Maior que Data Final
        /// </summary>
        public int InformarDataInicialMaiorDataFinal
        {
            get { return _informarDataInicialMaiorDataFinal; }
            set { _informarDataInicialMaiorDataFinal = value; }
        }
        #endregion

        #region Construtor
        /// <summary>
        /// Construtor ValidaReferenciasPoliticaCorretagem
        /// </summary>
        public ValidaReferenciasPoliticaCorretagem() { }
        #endregion

        #region Métodos

        /// <summary>
        /// Validate
        /// </summary>
        public void Validate()
        {
            if (base.EntityToValidate != null)
            {
                try
                {
                    this.ValidaCondicoesVerificacao();
                    this.ValidaControleBeneficio();
                    this.ValidaDataInformada();
                }
                catch (ValidationException ve)
                {
                    base.AddValidationError(ve.ValidationErrors);
                }
            }
            else
            {
                this.AddValidationError(ErroObjetoNulo);
            }
        }

        private void ValidaCondicoesVerificacao()
        {
            if (base.EntityToValidate.EfetuarVerificacao.HasValue && base.EntityToValidate.EfetuarVerificacao.Value)
            {
                if (base.EntityToValidate.Verificacoes == null || base.EntityToValidate.Verificacoes.Count == 0)
                {
                    this.AddValidationError(InformarCondicoesVerificacao);
                }
            }
        }

        private void ValidaControleBeneficio()
        {
            if (base.EntityToValidate.TipoControleBeneficio != BusinessEntity.Enum.TipoControleBeneficio.Nao)
            {
                if (!(base.EntityToValidate.Beneficios.Count > 0))
                {
                    this.AddValidationError(InformarControleBeneficio);
                }
            }
        }

        private void ValidaDataInformada()
        {
            if (base.EntityToValidate.DataInicial.HasValue && base.EntityToValidate.DataFinal.HasValue)
            {
                if (base.EntityToValidate.DataInicial.Value > base.EntityToValidate.DataFinal.Value)
                {
                    this.AddValidationError(InformarDataInicialMaiorDataFinal);
                }
            }
        }

        /// <summary>
        /// Retorna uma lista de Erros
        /// </summary>
        /// <returns></returns>
        public List<ValidationError> GetErrors()
        {
            return base.ErrorsList;
        }

        #endregion
    }
}